[Day08] 想要變強就要不斷修煉,這是唯一的方法!
啊啦啦標題不小心用了火影梗,常常聽別人說,做事情要用對方法,這件事在 Ruby 的世界裡也是一樣的!
所以說,方法係啥?為什麼要使用方法?程式語言裡的方法是什麼?
正常來說,我們不會想把所有的程式碼寫在同一個檔案裡。而且如果是在開發專案,隨著複雜度提升,不同的程式通常會依照功能和類別(也可能只是按英文字母的順序)排列,分佈在專案裡的不同位置。
不過,由於不同的位置也會需要用到共同的程式碼,為了避免重複 coding,這時候就會透過 方法(method) 來解決這個問題,如果是學過 Javascript 函式(function)的朋友們,應該可以很快知道我在說什麼,它與 Ruby 的方法實際上是非常接近的東西。
先來看看在 Ruby 如何定義一個方法:
def method_name
# 這個方法要做的事情
end
每個方法都會被賦予一個名稱,會使用 def
和 end
兩個單詞來定義方法,而夾在中間的部分則是要請這個方法做的事情。
一旦定義了一個方法以後,就可以開始使喚它做事...(誤)
當 變數
和 方法
的名稱如果相同時,同名的 變數
會蓋掉同名的 方法
,需要特別留意!所以在命名方法時,請花點時間好好思考,取個獨一無二又能看出在做什麼的名字吧!
剛剛已經介紹了如何定義方法,不過在定義方法時,還可以設定這個方法需要哪些參數(parameter):
def walk(place)
puts "我想去#{place}散步!"
end
由於我們設定 walk
需要一個參數 place
,所以在呼叫 walk
時,也必須要剛好給一個引數(argument),多了或少了都不行,在 Ruby 的世界裡,只要引數和參數的數量不同,方法就無法順利執行。
重新整理一下:
接下來,我們來呼叫看看這個 walk
方法!
呼叫(invoke)方法的意思其實就是使用這個方法,算是技術圈的術語之一吧,總覺得有一種召喚某某方法來幫自己完成一件事的感覺。另外,也有看過其他大大稱為「調用」,只是我更習慣把它稱為「呼叫」。
要執行已經定義的方法的方式很簡單,只要直接呼叫方法的名字即可:
walk("公園")
# 印出:
我想去公園散步!
甚至省略了 (
)
也可以,這是 Ruby 獨有的祕技!
walk"公園"
# 印出:
我想去公園散步!
事實上,方法還可以被物件(object)所呼叫,不過那部分就等介紹到類別與物件的時候再一起說明吧!
比起 Javascript 在呼叫函式時一定要有 ()
,Ruby 是不是厲害許多呢!(不小心就引戰了)不過,前提是要記得自己定義過哪些方法...
你的名字是?あなたのお名前は?
在定義方法的時候,我們可以先給參數一個預設值,這麼一來,如果在呼叫方法時沒有給引數,方法會以預設值去執行,假裝自己有拿到引數
def valentine(gift = "chocolate")
puts "謝謝妳送我#{gift}! 我很開心!"
end
# 呼叫
valentine
# 印出
謝謝妳送我chocolate! 我很開心!
突然想到有一年情人節買巧克力給自己...(哭)
def play_baseball(pitcher, catcher, batter)
puts "需要 #{pitcher}, #{catcher}, #{batter} 才能打棒球"
end
play_baseball("熱狗", "爆米花", "可樂")
# 印出:
需要 熱狗, 爆米花, 可樂 才能打棒球
聽說在 Ruby 3.0 版本後,方法帶入的參數還會增加型別限制!期待!
除了可以用常見的英文、底線及數字的組合替方法命名之外,有時候還會看到帶有問號 ?
、驚嘆號 !
或 =
的方法,它們通常代表了某種特殊含義,但這些符號只能放在方法名字的最後面。
?
表示這個方法會回傳 true
或 false
譬如:
[1, 2, 3, 4, 5].include?(2)
=> true
!
表示使用這個方法可能會產生「副作用」!我直接舉個簡單的例子,先假設有一個陣列 array
:
array = [1, 1, 2, 3, 3]
使用 uniq
這個方法把重複的元素去掉:
array.uniq
=> [1, 2, 3]
這時候原本的 array
沒有產生改變:
array
=> [1, 1, 2, 3, 3]
但是如果我用的是 uniq!
這個方法把重複的元素去掉:
array.uniq!
=> [1, 2, 3]
這時候原本的 array
就變成了:
array
=> [1, 2, 3]
至於在方法名稱後面加上等號 =
的意義,目前我也還說不出個所以然,只好先把我的參考資料放在這,等日後再回來補齊了:
在 Ruby 或 Rails ,我們經常會使用這樣的命名慣例,以節省大家的工作時間,我覺得這是非常棒的一個共識。
如果想更深入研究 Ruby 的方法,非常推薦大家先拜讀龍哥的這篇文章:如果想要找某個方法的定義,該怎麼找? 今天就先到介紹這邊啦!